1주차
-
01
오리엔테이션
- 멘토 및 클래스 메이트 자기소개
- 클래스 대상 및 목표 안내
- 전체 커리큘럼 안내
-
02
개발 환경 구축하기
- Docker를 사용한 우분투 환경 설정
- QEMU, 커널, 빌드루트
-
03
QEMU로 새로운 SoC 설계하기
- QEMU machine 추가
-
04
CPU 파악하기
- GIC (Generic Interrupt Controller)
- 멀티코어 ARMv8
- TImer
-
05
디바이스 트리 알아보기
- 커널에 디바이스 트리 추가하기
- 디바이스 트리 노드 작성법
-
06
새 SoC에서 리눅스 부팅하기
- UART 설정하기 (ARM PL011)
- Initramfs 설정하기
-
07
실시간 Q&A
-
과제
주어진 데이터 시트에 맞는 SoC 구현하기
- QEMU를 활용한 SoC 설계
- SoC 디바이스 트리 작성
2주차
-
01
1주차 세션 회고 및 과제 피드백
-
02
AMBA 버스 이해하기
- AHB, APB, Bridge
-
03
MMIO 개념 파악하기
- PIO와 MMIO의 차이
-
04
인터럽트와 폴링 개념 파악하기
- 인터럽트와 폴링의 장단점
-
05
새로운 MMIO 하드웨어 만들기
- QEMU에서 MemoryRegion 사용하기
-
06
MMIO 하드웨어 드라이버 만들기
- 물리메모리 사용하기
- 로우메모리, 하이메모리
-
07
실시간 Q&A
-
과제
Host logging 디바이스 개발하기
- QEMU에 새로운 디바이스 추가
- 리눅스 디바이스 드라이버 개발
3주차
-
01
2주차 세션 회고 및 과제 피드백
-
02
DMA 흐름 이해하기
- DMA와 MMIO의 차이
-
03
Scatter/Gather 개념 파악하기
- Scatter/Gather가 필요한 이유
-
04
DMA 컨트롤러 추가하기
- ARM PL330
-
05
DMA API를 사용하여 드라이버 개선하기
-
06
MMC 하드웨어로 Rootfs 사용하기
-
07
실시간 Q&A
-
과제
DMA로 MMIO 디바이스 성능 개선하기
- 앞서 과제에서 개발한 디바이스에 DMA를 접목
4주차
-
01
3주차 세션 회고 및 과제 피드백
-
02
GPIO 이해하기
- GPIO를 사용하는 목적
-
03
GPIO의 물리적인 구조 파악하기
- Pull-up, Pull-down
-
04
새로운 GPIO 하드웨어 만들기
- ARM PL061
-
05
libgpiod 툴을 사용하여 GPIO 테스트하기
- GPIOLIB
-
06
GPIO 하드웨어 드라이버 만들기
- 커널에서 gpio 사용하는 방법
-
07
실시간 Q&A
-
과제
LED와 버튼을 gpiochip과 연동하기
- QEMU에 새로운 디바이스 추가
- 리눅스 디바이스 드라이버 개발
5주차
-
01
4주차 세션 회고 및 과제 피드백
-
02
I2C 통신 이해하기
- I2C 통신을 사용하는 목적
- I2C 통신의 흐름
-
03
I2C의 물리적인 구조 파악하기
- I2C의 핀 커넥트
-
04
새로운 I2C 하드웨어 만들기
- ARM SBCon
-
05
I2C 툴을 사용하여 I2C 테스트하기
- /dev/i2c-*
-
06
I2C 하드웨어 드라이버 만들기
- 커널에서 i2c 사용하는 방법
-
07
실시간 Q&A
-
과제
Pseudo 센서를 가지고 있는 I2C 디바이스 개발하기
- QEMU에 새로운 디바이스 추가
- 리눅스 디바이스 드라이버 개발
6주차
-
01
5주차 세션 회고 및 과제 피드백
-
02
SPI 통신 이해하기
- SPI 통신을 사용하는 목적
- SPI 통신의 흐름
-
03
SPI의 물리적인 구조 파악하기
- SPI의 핀 커넥트
- 칩 셀렉트 핀
-
04
새로운 SPI 하드웨어 만들기
- ARM PL022
-
05
SPI 툴을 사용하여 SPI 테스트하기
- /dev/spidev0.*
-
06
SPI 하드웨어 드라이버 만들기
- 커널에서 spi 사용하는 방법
-
07
6주간 진행 Wrap up